home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / utils / dos / rm.c < prev    next >
C/C++ Source or Header  |  1995-04-18  |  3KB  |  168 lines

  1.  
  2.  
  3. /*
  4.  *
  5.  *    Copyright 1993 Algorithms Corporation
  6.  *
  7.  *    ALL RIGHTS RESERVED.
  8.  *
  9.  *
  10.  *
  11.  */
  12.  
  13.  
  14.  
  15.  
  16. #include <stdio.h> 
  17. #include <sys/types.h>
  18. #include <sys/stat.h>
  19. #include <dos.h>
  20.  
  21. static    void    strip_path();
  22. static    void    usage();
  23. static    int    rm(), erase_dir();;
  24.  
  25.  
  26. static    int    verbose = 0;
  27.  
  28.  
  29. int    main(argc, argv)
  30. int    argc;
  31. char    *argv[];
  32. {
  33.     int    r, i, isdir, err=0, force=0, quiet=0, recur=0, zero=0;
  34.     struct    stat    sb;
  35.     
  36.     if (argc < 2)
  37.         usage();
  38.     for (i=1 ; i < argc ; ++i)  {
  39.         if (argv[i][0] == '-')  {
  40.             for (r=1 ; argv[i][r] ; ++r)
  41.                 switch (argv[i][r])  {
  42.                 case 'f':
  43.                 case 'F':
  44.                     force = 1;
  45.                     break;
  46.                 case 'q':
  47.                 case 'Q':
  48.                     quiet = 1;
  49.                     verbose = 0;
  50.                     break;
  51.                 case 'r':
  52.                 case 'R':
  53.                     recur = 1;
  54.                     break;
  55.                 case 'v':
  56.                 case 'V':
  57.                     verbose = 1;
  58.                     quiet = 0;
  59.                     break;
  60.                 case 'z':
  61.                 case 'Z':
  62.                     zero = 1;
  63.                     break;
  64.                 default:
  65.                     fprintf(stderr, "rm:  Unknown flag %c\n", argv[i][r]);
  66.                     usage();
  67.                     break;
  68.                 }
  69.             continue;
  70.         }
  71.         r = stat(argv[i], &sb);
  72.         if (!r  &&  recur  &&  (sb.st_mode & S_IFDIR))
  73.             err |= erase_dir(argv[i], force, quiet);
  74.         else
  75.             err |= rm(argv[i], force, quiet);
  76.     }
  77.     return zero ? 0 : err;
  78. }
  79.  
  80. static    void    usage()
  81. {
  82.     printf("Usage:\trm  [-option]  file...\n"); 
  83.     printf("Options:\n");
  84.     printf("\tf\tforce (good for read only files)\n");
  85.     printf("\tq\tquiet (no error messages)\n");
  86.     printf("\tr\trecurse sub-directories\n");
  87.     printf("\tv\tverbose\n");
  88.     printf("\tz\talways return 0\n");
  89.     exit(1); 
  90. }
  91.  
  92. static    void    strip_path(to, from)
  93. char    *from, *to;
  94. {
  95.     char    *t;
  96.  
  97.     for (t=from ; *t ; ++t)
  98.         if (*t == '/'  ||  *t == '\\'  ||  *t == ':')
  99.             from = t + 1;
  100.     strcpy(to, from);
  101. }
  102.  
  103. static    int    rm(f, force, quiet)
  104. char    *f;
  105. int    force, quiet;
  106. {
  107.     int    r;
  108.  
  109.     if (verbose)
  110.         fprintf(stderr, "Removing %s\n", f);
  111.     r = unlink(f);
  112.     if (r  &&  force)  {
  113.         _dos_setfileattr(f, _A_NORMAL);
  114.         r = unlink(f);
  115.     }
  116.     if (r  &&  !quiet)
  117.         fprintf(stderr, "rm:  Can't remove %s\n", f);
  118.     return(r);
  119. }
  120.  
  121. static    int    erase_dir(d, force, quiet)
  122. char    *d;
  123. int    force, quiet;
  124. {
  125.     char    path[80];
  126.     struct    stat    statbuf;
  127.     struct    find_t    dir;
  128.     int    err=0, r;
  129.     
  130.     sprintf(path, "%s/*.*", d);
  131.     if (_dos_findfirst(path, _A_NORMAL|_A_RDONLY|_A_HIDDEN|_A_SYSTEM|_A_SUBDIR|_A_ARCH, &dir))  
  132.         goto end;
  133.     do {
  134.         if (strcmp(dir.name, ".")  &&  strcmp(dir.name, ".."))  {
  135.             sprintf(path, "%s/%s", d, dir.name);
  136.             stat(path, &statbuf);
  137.             if (statbuf.st_mode & S_IFDIR)  /*  its a directory    */
  138.                 err |= erase_dir(path, force, quiet);
  139.             else
  140.                 err |= rm(path, force, quiet);
  141.         }
  142.     }  while  (!_dos_findnext(&dir));
  143.  end:
  144.     if (strcmp(d, ".")  &&  strcmp(d, "..")  &&
  145.         strcmp(d, "/")  &&  strcmp(d, "\\"))  {
  146.         r = rmdir(d);
  147.         if (r  &&  !quiet)
  148.             fprintf(stderr, "rm:  Can't remove directory %s\n", d);
  149.         return r;
  150.     }  else
  151.         return 0;
  152. }
  153.  
  154.  
  155.  
  156.  
  157. /*
  158.  *
  159.  *    Copyright 1993 Algorithms Corporation
  160.  *
  161.  *    ALL RIGHTS RESERVED.
  162.  *
  163.  *
  164.  *
  165.  */
  166.  
  167.  
  168.